home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / pastutor.EXE / tutor11c.pas < prev    next >
Pascal/Delphi Source File  |  1998-04-02  |  12KB  |  485 lines

  1. {************************************************}
  2. {                                                }
  3. {   Turbo Vision 2.0 Demo                        }
  4. {   Copyright (c) 1992 by Borland International  }
  5. {                                                }
  6. {************************************************}
  7.  
  8. program Tutor11c;
  9.  
  10. uses Memory, TutConst, Drivers, Objects, Views, Menus, App, Dialogs,
  11.   Editors, StdDlg, Validate;
  12.  
  13. type
  14.   POrder = ^TOrder;
  15.   TOrder = record
  16.     OrderNum: string[8];
  17.     OrderDate: string[8];
  18.     StockNum: string[8];
  19.     Quantity: string[5];
  20.     Payment, Received, MemoLen: Word;
  21.     MemoText: array[0..255] of Char;
  22.   end;
  23.  
  24.   POrderObj = ^TOrderObj;
  25.   TOrderObj = object(TObject)
  26.     TransferRecord: TOrder;
  27.     constructor Load(var S: TStream);
  28.     procedure Store(var S: TStream);
  29.   end;
  30.  
  31.   POrderWindow = ^TOrderWindow;
  32.   TOrderWindow = object(TDialog)
  33.     constructor Init;
  34.     destructor Done; virtual;
  35.     procedure HandleEvent(var Event: TEvent); virtual;
  36.   end;
  37.  
  38.   TTutorApp = object(TApplication)
  39.     ClipboardWindow: PEditWindow;
  40.     OrderWindow: POrderWindow;
  41.     constructor Init;
  42.     destructor Done; virtual;
  43.     procedure CancelOrder;
  44.     procedure DoAboutBox;
  45.     procedure EnterNewOrder;
  46.     procedure HandleEvent(var Event: TEvent); virtual;
  47.     procedure InitMenuBar; virtual;
  48.     procedure InitStatusLine; virtual;
  49.     procedure LoadDesktop;
  50.     procedure NewWindow;
  51.     procedure OpenOrderWindow;
  52.     procedure OpenWindow;
  53.     procedure SaveDesktop;
  54.     procedure SaveOrderData;
  55.     procedure ShowOrder(AOrderNum: Integer);
  56.   end;
  57.  
  58. var
  59.   ResFile: TResourceFile;
  60.   OrderInfo: TOrder;
  61.   OrderColl: PCollection;
  62.   CurrentOrder: Integer;
  63.   TempOrder: POrderObj;
  64.  
  65. const
  66.   ROrderObj: TStreamRec = (
  67.      ObjType: 15000;
  68.      VmtLink: Ofs(TypeOf(TOrderObj)^);
  69.      Load:    @TOrderObj.Load;
  70.      Store:   @TOrderObj.Store
  71.   );
  72.   ROrderWindow: TStreamRec = (
  73.      ObjType: 15001;
  74.      VmtLink: Ofs(TypeOf(TOrderWindow)^);
  75.      Load:    @TOrderWindow.Load;
  76.      Store:   @TOrderWindow.Store
  77.   );
  78.  
  79. procedure TutorStreamError(var S: TStream); far;
  80. var
  81.   ErrorMessage: String;
  82. begin
  83.   case S.Status of
  84.     stError: ErrorMessage := 'Stream access error';
  85.     stInitError: ErrorMessage := 'Cannot initialize stream';
  86.     stReadError: ErrorMessage := 'Read beyond end of stream';
  87.     stWriteError: ErrorMessage := 'Cannot expand stream';
  88.     stGetError: ErrorMessage := 'Unregistered type read from stream';
  89.     stPutError: ErrorMessage := 'Unregistered type written to stream';
  90.     end;
  91.   DoneVideo;
  92.   PrintStr('Error: ' + ErrorMessage);
  93.   Halt(Abs(S.Status));
  94. end;
  95.  
  96. procedure LoadOrders;
  97. var
  98.   OrderFile: TBufStream;
  99. begin
  100.   OrderFile.Init('ORDERS.DAT', stOpenRead, 1024);
  101.   OrderColl := PCollection(OrderFile.Get);
  102.   OrderFile.Done;
  103. end;
  104.  
  105. procedure SaveOrders;
  106. var
  107.   OrderFile: TBufStream;
  108. begin
  109.   OrderFile.Init('ORDERS.DAT', stOpenWrite, 1024);
  110.   OrderFile.Put(OrderColl);
  111.   OrderFile.Done;
  112. end;
  113.  
  114. constructor TOrderObj.Load(var S: TStream);
  115. begin
  116.   inherited Init;
  117.   S.Read(TransferRecord, SizeOf(TransferRecord));
  118. end;
  119.  
  120. procedure TOrderObj.Store(var S: TStream);
  121. begin
  122.   S.Write(TransferRecord, SizeOf(TransferRecord));
  123. end;
  124.  
  125. constructor TOrderWindow.Init;
  126. var
  127.   R: TRect;
  128.   Field: PInputLine;
  129.   Cluster: PCluster;
  130.   Memo: PMemo;
  131. begin
  132.   R.Assign(0, 0, 60, 17);
  133.   inherited Init(R, 'Orders');
  134.   Options := Options or ofCentered;
  135.   HelpCtx := $F000;
  136.  
  137.   R.Assign(13, 2, 23, 3);
  138.   Field := New(PInputLine, Init(R, 8));
  139.   Field^.SetValidator(New(PRangeValidator, Init(1, 99999)));
  140.   Insert(Field);
  141.   R.Assign(2, 2, 12, 3);
  142.   Insert(New(PLabel, Init(R, '~O~rder #:', Field)));
  143.  
  144.   R.Assign(43, 2, 53, 3);
  145.   Field := New(PInputLine, Init(R, 8));
  146.   Field^.SetValidator(New(PPXPictureValidator,
  147.     Init('{#[#]}/{#[#]}/{##[##]}', True)));
  148.   Insert(Field);
  149.   R.Assign(26, 2, 41, 3);
  150.   Insert(New(PLabel, Init(R, '~D~ate of order:', Field)));
  151.  
  152.   R.Assign(13, 4, 23, 5);
  153.   Field := New(PInputLine, Init(R, 8));
  154.   Field^.SetValidator(New(PPXPictureValidator, Init('&&&-####', True)));
  155.   Insert(Field);
  156.   R.Assign(2, 4, 12, 5);
  157.   Insert(New(PLabel, Init(R, '~S~tock #:', Field)));
  158.  
  159.   R.Assign(46, 4, 53, 5);
  160.   Field := New(PInputLine, Init(R, 5));
  161.   Field^.SetValidator(New(PRangeValidator, Init(1, 99999)));
  162.   Insert(Field);
  163.   R.Assign(26, 4, 44, 5);
  164.   Insert(New(PLabel, Init(R, '~Q~uantity ordered:', Field)));
  165.  
  166.   R.Assign(3, 7, 57, 8);
  167.   Cluster := New(PRadioButtons, Init(R,
  168.     NewSItem('Cash   ',
  169.     NewSItem('Check  ',
  170.     NewSItem('P.O.   ',
  171.     NewSItem('Account', nil))))));
  172.   Insert(Cluster);
  173.   R.Assign(2, 6, 21, 7);
  174.   Insert(New(PLabel, Init(R, '~P~ayment method:', Cluster)));
  175.  
  176.   R.Assign(22, 8, 37, 9);
  177.   Cluster := New(PCheckBoxes, Init(R, NewSItem('~R~eceived', nil)));
  178.   Insert(Cluster);
  179.  
  180.   R.Assign(3, 10, 57, 13);
  181.   Memo := New(PMemo, Init(R, nil, nil, nil, 255));
  182.   Insert(Memo);
  183.   R.Assign(2, 9, 9, 10);
  184.   Insert(New(PLabel, Init(R, 'Notes:', Memo)));
  185.  
  186.   R.Assign(2, 14, 12, 16);
  187.   Insert(New(PButton, Init(R, '~N~ew', cmOrderNew, bfNormal)));
  188.   R.Assign(13, 14, 23, 16);
  189.   Insert(New(PButton, Init(R, '~S~ave', cmOrderSave, bfDefault)));
  190.   R.Assign(24, 14, 34, 16);
  191.   Insert(New(PButton, Init(R, 'Re~v~ert', cmOrderCancel, bfNormal)));
  192.   R.Assign(35, 14, 45, 16);
  193.   Insert(New(PButton, Init(R, 'Next', cmOrderNext, bfNormal)));
  194.   R.Assign(46, 14, 56, 16);
  195.   Insert(New(PButton, Init(R, 'Prev', cmOrderPrev, bfNormal)));
  196.   SelectNext(False);
  197. end;
  198.  
  199. destructor TOrderWindow.Done;
  200. begin
  201.   DisableCommands([cmOrderNext, cmOrderPrev, cmOrderSave]);
  202.   inherited Done;
  203. end;
  204.  
  205. procedure TOrderWindow.HandleEvent(var Event: TEvent);
  206. begin
  207.   inherited HandleEvent(Event);
  208.   if (Event.What = evBroadcast) and
  209.     (Event.Command = cmFindOrderWindow) then
  210.     ClearEvent(Event);
  211. end;
  212.  
  213. constructor TTutorApp.Init;
  214. var
  215.   R: TRect;
  216. begin
  217.   MaxHeapSize := 8192;
  218.   EditorDialog := StdEditorDialog;
  219.   StreamError := @TutorStreamError;
  220.   RegisterMenus;
  221.   RegisterObjects;
  222.   RegisterViews;
  223.   RegisterApp;
  224.   RegisterEditors;
  225.   RegisterDialogs;
  226.   RegisterValidate;
  227.   RegisterType(ROrderObj);
  228.   RegisterType(ROrderWindow);
  229.   ResFile.Init(New(PBufStream, Init('TUTORIAL.TVR', stOpenRead, 1024)));
  230.   inherited Init;
  231.   DisableCommands([cmStockWin, cmSupplierWin]);
  232.   Desktop^.GetExtent(R);
  233.   ClipboardWindow := New(PEditWindow, Init(R, '', wnNoNumber));
  234.   if ValidView(ClipboardWindow) <> nil then
  235.   begin
  236.     ClipboardWindow^.Hide;
  237.     InsertWindow(ClipboardWindow);
  238.     Clipboard := ClipboardWindow^.Editor;
  239.     Clipboard^.CanUndo := False;
  240.   end;
  241.   LoadOrders;
  242.   CurrentOrder := 0;
  243.   OrderInfo := POrderObj(OrderColl^.At(CurrentOrder))^.TransferRecord;
  244.   DisableCommands([cmOrderNext, cmOrderPrev, cmOrderCancel, cmOrderSave]);
  245. end;
  246.  
  247. destructor TTutorApp.Done;
  248. begin
  249.   ResFile.Done;
  250.   inherited Done;
  251. end;
  252.  
  253. procedure TTutorApp.CancelOrder;
  254. begin
  255.   if CurrentOrder < OrderColl^.Count then
  256.     ShowOrder(CurrentOrder)
  257.   else
  258.   begin
  259.     Dispose(TempOrder, Done);
  260.     ShowOrder(CurrentOrder - 1);
  261.   end;
  262. end;
  263.  
  264. procedure TTutorApp.DoAboutBox;
  265. begin
  266.   ExecuteDialog(PDialog(ResFile.Get('ABOUTBOX')), nil);
  267. end;
  268.  
  269. procedure TTutorApp.EnterNewOrder;
  270. begin
  271.   OpenOrderWindow;
  272.   CurrentOrder := OrderColl^.Count;
  273.   TempOrder := New(POrderObj, Init);
  274.   OrderInfo := TempOrder^.TransferRecord;
  275.   OrderWindow^.SetData(OrderInfo);
  276.   DisableCommands([cmOrderNext, cmOrderPrev, cmOrderNew]);
  277.   EnableCommands([cmOrderCancel, cmOrderSave]);
  278. end;
  279.  
  280. procedure TTutorApp.HandleEvent(var Event: TEvent);
  281. var
  282.   R: TRect;
  283. begin
  284.   inherited HandleEvent(Event);
  285.   if Event.What = evCommand then
  286.   begin
  287.     case Event.Command of
  288.       cmOrderNew:
  289.         begin
  290.           EnterNewOrder;
  291.           ClearEvent(Event);
  292.         end;
  293.       cmOrderCancel:
  294.         begin
  295.           CancelOrder;
  296.           ClearEvent(Event);
  297.         end;
  298.       cmOrderNext:
  299.         begin
  300.           ShowOrder(CurrentOrder + 1);
  301.           ClearEvent(Event);
  302.         end;
  303.       cmOrderPrev:
  304.         begin
  305.           ShowOrder(CurrentOrder - 1);
  306.           ClearEvent(Event);
  307.         end;
  308.       cmOrderSave:
  309.         begin
  310.           SaveOrderData;
  311.           ClearEvent(Event);
  312.         end;
  313.       cmOrderWin:
  314.         begin
  315.           OpenOrderWindow;
  316.           ClearEvent(Event);
  317.         end;
  318.       cmOptionsLoad:
  319.         begin
  320.           LoadDesktop;
  321.           ClearEvent(Event);
  322.         end;
  323.       cmOptionsSave:
  324.         begin
  325.           SaveDesktop;
  326.           ClearEvent(Event);
  327.         end;
  328.       cmClipShow:
  329.         with ClipboardWindow^ do
  330.         begin
  331.           Select;
  332.           Show;
  333.           ClearEvent(Event);
  334.         end;
  335.       cmNew:
  336.         begin
  337.           NewWindow;
  338.           ClearEvent(Event);
  339.         end;
  340.       cmOpen:
  341.         begin
  342.           OpenWindow;
  343.           ClearEvent(Event);
  344.         end;
  345.       cmOptionsVideo:
  346.         begin
  347.           SetScreenMode(ScreenMode xor smFont8x8);
  348.           ClearEvent(Event);
  349.         end;
  350.       cmAbout:
  351.         begin
  352.           DoAboutBox;
  353.           ClearEvent(Event);
  354.         end;
  355.     end;
  356.   end;
  357. end;
  358.  
  359. procedure TTutorApp.InitMenuBar;
  360. begin
  361.   MenuBar := PMenuBar(ResFile.Get('MAINMENU'));
  362. end;
  363.  
  364. procedure TTutorApp.InitStatusLine;
  365. var
  366.   R: TRect;
  367. begin
  368.   StatusLine := PStatusLine(ResFile.Get('STATUS'));
  369.   GetExtent(R);
  370.   StatusLine^.MoveTo(0, R.B.Y - 1);
  371. end;
  372.  
  373. procedure TTutorApp.LoadDesktop;
  374. var
  375.   DesktopFile: TBufStream;
  376.   TempDesktop: PDesktop;
  377.   R: TRect;
  378. begin
  379.   DesktopFile.Init('DESKTOP.TUT', stOpenRead, 1024);
  380.   TempDesktop := PDesktop(DesktopFile.Get);
  381.   DesktopFile.Done;
  382.   if ValidView(TempDesktop) <> nil then
  383.   begin
  384.     Desktop^.Delete(ClipboardWindow);
  385.     Delete(Desktop);
  386.     Dispose(Desktop, Done);
  387.     Desktop := TempDesktop;
  388.     Insert(Desktop);
  389.     GetExtent(R);
  390.     R.Grow(0, -1);
  391.     Desktop^.Locate(R);
  392.     InsertWindow(ClipboardWindow);
  393.     OrderWindow := Message(Desktop, evBroadcast, cmFindOrderWindow, nil);
  394.     if OrderWindow <> nil then ShowOrder(CurrentOrder);
  395.   end;
  396. end;
  397.  
  398. procedure TTutorApp.NewWindow;
  399. var
  400.   R: TRect;
  401.   TheWindow: PEditWindow;
  402. begin
  403.   R.Assign(0, 0, 60, 20);
  404.   TheWindow := New(PEditWindow, Init(R, '', wnNoNumber));
  405.   InsertWindow(TheWindow);
  406. end;
  407.  
  408. procedure TTutorApp.OpenOrderWindow;
  409. begin
  410.   if Message(Desktop, evBroadcast, cmFindOrderWindow, nil) = nil then
  411.   begin
  412.     OrderWindow := New(POrderWindow, Init);
  413.     InsertWindow(OrderWindow);
  414.   end
  415.   else
  416.     if PView(OrderWindow) <> Desktop^.TopView then OrderWindow^.Select;
  417.   ShowOrder(0);
  418. end;
  419.  
  420. procedure TTutorApp.OpenWindow;
  421. var
  422.   R: TRect;
  423.   FileDialog: PFileDialog;
  424.   TheFile: FNameStr;
  425. const
  426.   FDOptions: Word = fdOKButton or fdOpenButton;
  427. begin
  428.   TheFile := '*.*';
  429.   New(FileDialog, Init(TheFile, 'Open file', '~F~ile name',
  430.     FDOptions, 1));
  431.   if ExecuteDialog(FileDialog, @TheFile) <> cmCancel then
  432.   begin
  433.     R.Assign(0, 0, 75, 20);
  434.     InsertWindow(New(PEditWindow, Init(R, TheFile, wnNoNumber)));
  435.   end;
  436. end;
  437.  
  438. procedure TTutorApp.SaveDesktop;
  439. var
  440.   DesktopFile: TBufStream;
  441. begin
  442.   Desktop^.Delete(ClipboardWindow);
  443.   DesktopFile.Init('DESKTOP.TUT', stCreate, 1024);
  444.   DesktopFile.Put(Desktop);
  445.   DesktopFile.Done;
  446.   InsertWindow(ClipboardWindow);
  447. end;
  448.  
  449. procedure TTutorApp.SaveOrderData;
  450. begin
  451.   if OrderWindow^.Valid(cmClose) then
  452.   begin
  453.     OrderWindow^.GetData(OrderInfo);
  454.     if CurrentOrder = OrderColl^.Count then
  455.     begin
  456.       TempOrder^.TransferRecord := OrderInfo;
  457.       OrderColl^.Insert(TempOrder);
  458.     end
  459.     else POrderObj(OrderColl^.At(CurrentOrder))^.TransferRecord := OrderInfo;
  460.     SaveOrders;
  461.     ShowOrder(CurrentOrder);
  462.   end;
  463. end;
  464.  
  465. procedure TTutorApp.ShowOrder(AOrderNum: Integer);
  466. begin
  467.   CurrentOrder := AOrderNum;
  468.   OrderInfo := POrderObj(OrderColl^.At(CurrentOrder))^.TransferRecord;
  469.   OrderWindow^.SetData(OrderInfo);
  470.   if CurrentOrder > 0 then EnableCommands([cmOrderPrev])
  471.   else DisableCommands([cmOrderPrev]);
  472.   if OrderColl^.Count > 0 then EnableCommands([cmOrderNext]);
  473.   if CurrentOrder >= OrderColl^.Count - 1 then DisableCommands([cmOrderNext]);
  474.   EnableCommands([cmOrderSave, cmOrderNew]);
  475. end;
  476.  
  477. var
  478.   TutorApp: TTutorApp;
  479.  
  480. begin
  481.   TutorApp.Init;
  482.   TutorApp.Run;
  483.   TutorApp.Done;
  484. end.
  485.